package com.gxg.common.redis;

import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface JedisClient {

    /**
     * 获取
     *
     * @return Redis Get 命令用于获取指定 key 的值。如果 key 不存在，返回 nil 。如果key
     * 储存的值不是字符串类型，返回一个错误
     */
    String get(String key);

    /**
     * 设置
     *
     * @return Redis SET 命令用于设置给定 key 的值。如果 key 已经存储其他值， SET 就覆写旧值，且无视类型。
     */
    String set(String key, String value);

    /**
     * Hashget
     *
     * @return Redis Hget 命令用于返回哈希表中指定字段的值。
     */
    String hget(String hkey, String key);

    /**
     * Hashset
     *
     * @return Redis Hset 命令用于为哈希表中的字段赋值 。 如果哈希表不存在，一个新的哈希表被创建并进行 HSET 操作。
     * 如果字段已经存在于哈希表中，旧值将被覆盖。
     */
    long hset(String hkey, String key, String value);

    /**
     * incr
     *
     * @return Redis Incr 命令将 key 中储存的数字值增一。 如果 key 不存在，那么 key 的值会先被初始化为 0
     * ，然后再执行 INCR 操作。 如果值包含错误的类型，或字符串类型的值不能表示为数字，那么返回一个错误。 本操作的值限制在 64
     * 位(bit)有符号数字表示之内
     */
    long incr(String key);

    /**
     * 将 key 中储存的数字值减一。 如果 key 不存在，那么 key 的值会先被初始化为 0 ，然后再执行 DECR 操作。
     * 如果值包含错误的类型，或字符串类型的值不能表示为数字，那么返回一个错误。 本操作的值限制在 64 位(bit)有符号数字表示之内。
     * 关于递增(increment) / 递减(decrement)操作的更多信息，请参见 INCR 命令。
     */
    long decr(String key);

    /**
     * expire
     *
     * @return Redis Expire 命令用于设置 key 的过期时间。key 过期后将不再可用。
     */
    long expire(String key, int second);

    /**
     * ttl
     *
     * @return Redis TTL 命令以秒为单位返回 key 的剩余过期时间。
     */
    long ttl(String key);

    /**
     * del
     *
     * @return Redis DEL 命令用于删除已存在的键。不存在的 key 会被忽略。
     */
    long del(String key);

    /**
     * hdel
     *
     * @return Redis Hdel 命令用于删除哈希表 key 中的一个或多个指定字段，不存在的字段将被忽略。
     */
    long hdel(String hkey, String key);

    Collection<String> scan(String key);

    /**
     * 禁止使用，用与性能测试
     *
     * @param key
     * @return
     */
    Collection<String> sbkeys(String key);

    /**
     * 根据hkey查询flieds里面所有对象
     *
     * @param hkey
     * @return
     */

    Map<String, String> hgetAll(String hkey);

    /**
     * 根据hkey,key数组查询
     *
     * @param key
     * @param fields
     * @return
     */
    public List<String> hmget(final String key, final String... fields);
}
